package model;

import cn.hutool.core.util.ObjectUtil;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author： 杨浩然
 * @date： 2023-02-01 11:56
 */
@Data
public class DatabaseFromColumn {
    final static String excelColumnNameJson="{\"COLUMN_NAME\":\"列名称\",\"TYPE_NAME\":\"类型名\",\"COLUMN_SIZE\":\"列的大小\",\"DECIMAL_DIGITS\":\"小数部分的位数\",\"NULLABLE\":\"是否允许使用NULL\",\"REMARKS\":\"描述列的注释\",\"TYPE_NAME\":\"类型名\"}";
    static List<List<String>> typeHandle=new ArrayList<List<String>>();

    String COLUMN_NAME ; //列名称
    String TYPE_NAME;//数据源依赖的类型名称，
    int COLUMN_SIZE ;//列的大小
    int DECIMAL_DIGITS;//小数部分的位数。
    int NULLABLE ;//是否允许使用 NULL。
    String REMARKS ;//描述列的注释
    EqualsMessage equalsMessage ;//错误信息

    static {
        ArrayList<String> strings = new ArrayList<String>();
        strings.add("VARCHAR");
        strings.add("VARCHAR2");
        typeHandle.add(strings);
        ArrayList<String> strings2 = new ArrayList<String>();
        strings2.add("NUMBER");
        strings2.add("NUMERIC");
        typeHandle.add(strings2);
        ArrayList<String> strings3 = new ArrayList<String>();
        strings3.add("TIMESTAMP");
        strings3.add("TIMESTAMP(6)");
        strings3.add("DATE");
        typeHandle.add(strings3);
        ArrayList<String> strings4 = new ArrayList<String>();
        strings4.add("NVARCHAR2");
        strings4.add("NVARCHAR");
        typeHandle.add(strings4);
    }

    public boolean vagueEqual(String a,String b){
        for (int i = 0; i < typeHandle.size(); i++) {
            List<String> list = typeHandle.get(i);
            boolean aboo=false;
            boolean bboo=false;
            for (int j = 0; j < list.size(); j++) {
                String s = list.get(j);
                if (s.equals(a)){
                    aboo=true;
                }
                if (s.equals(b)){
                    bboo=true;
                }
            }
            if (aboo && bboo){
                return true;
            }
        }
        return false;
    }
    //此方法以当前类为基准，反应B类是否一致情况，对B类进行错误赋值
    public void equalsColumnUpdata(DatabaseFromColumn modelB){

        EqualsMessage equalsMessage = new EqualsMessage();
        boolean bootypevague=false;
        //类型全用大写
        if (!ObjectUtil.equal(TYPE_NAME.toUpperCase(),modelB.getTYPE_NAME().toUpperCase())){
            //进行模糊校验，如果依旧不匹配，则报错
            if (!vagueEqual(TYPE_NAME.toUpperCase(),modelB.getTYPE_NAME().toUpperCase())){
                bootypevague=true;
                equalsMessage.addErr("列类型不一致 标准:"+TYPE_NAME);
            }
        }
        if (!ObjectUtil.equal(String.valueOf(NULLABLE),String.valueOf(modelB.getNULLABLE()))){
            equalsMessage.addWarning("列非空允许不一致 标准:"+NULLABLE);
        }
        if (!ObjectUtil.equal(COLUMN_SIZE,modelB.getCOLUMN_SIZE())||!ObjectUtil.equal(DECIMAL_DIGITS,modelB.getDECIMAL_DIGITS())){
            //如果类型模糊化匹配成功了，则精度不需要报错
            if (!bootypevague){
                equalsMessage.addWarning("列大小精度不一致 标准:"+COLUMN_SIZE+" "+DECIMAL_DIGITS);
            }
        }
        if (!ObjectUtil.equal(REMARKS,modelB.getREMARKS())){
            equalsMessage.addWarning("列注释不一致 标准:"+REMARKS+" ");
        }
        //列缺失和列增多，不在此处判定，此处保证列名对应后调用
        if (!ObjectUtil.equal(COLUMN_NAME,modelB.getCOLUMN_NAME())){
            equalsMessage.addWarning("一致 但大小不敏感 标准："+COLUMN_NAME);
        }
        if (equalsMessage.msg.length()==0){
            equalsMessage=EqualsMessage.ok();
        }
        modelB.setEqualsMessage(equalsMessage);
    }

    //此方法以当前类为基准，反应B类是否一致情况
//    public EqualsMessage equalsColumn(DatabaseFromColumn modelB){
//        //列缺失和列增多，不在此处判定，此处保证列名对应后调用
////        if (!ObjectUtil.equal(columnName,modelB.getColumnName())){
////            return EqualsMessage.err("缺失列 标准："+columnName);
////        }
//        if (!ObjectUtil.equal(TYPE_NAME,modelB.getTYPE_NAME())){
//            return EqualsMessage.err("列类型不一致 标准:"+TYPE_NAME);
//        }
//        if (!ObjectUtil.equal(NULLABLE,modelB.getNULLABLE())){
//            return EqualsMessage.warning("列非空允许不一致 标准:"+NULLABLE);
//        }
//
//        if (!ObjectUtil.equal(COLUMN_SIZE,modelB.getCOLUMN_SIZE())||!ObjectUtil.equal(DECIMAL_DIGITS,modelB.getDECIMAL_DIGITS())){
//            return EqualsMessage.warning("列非空允许不一致 标准:"+COLUMN_SIZE+" "+DECIMAL_DIGITS);
//        }
//        if (!ObjectUtil.equal(REMARKS,modelB.getREMARKS())){
//            return EqualsMessage.warning("列注释不一致 标准:"+REMARKS+" ");
//        }
//        return EqualsMessage.ok();
//    }

}
